package com.dunke.service.impl;

import com.dunke.core.common.Result;
import com.dunke.core.common.ResultPage;
import com.dunke.core.data.GetData;
import com.dunke.core.data.PageData;
import com.dunke.core.data.staff.StaffInfo;
import com.dunke.core.data.staff.StaffLog;
import com.dunke.core.dto.StaffDataDto;
import com.dunke.core.dao.StaffDao;
import com.dunke.service.StaffService;
import com.dunke.utils.DateUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

/**
 * (DbStaff)表服务实现类
 *
 * @author makejava
 * @since 2021-06-23 18:33:09
 */
@Service("dbStaffService")
public class StaffServiceImpl implements StaffService {

    @Resource
    private StaffDao staffDao;

    /**
     * 新增数据
     * @param info 实例对象
     * @return 实例对象
     */
    @Override
    public Result insert(StaffInfo info) {
        StaffDataDto staff = this.staffDao.queryByIdNumber(info.getIdnumber());
        StaffLog log = new StaffLog();
        if (staff != null) {
            if (staff.getRecord() != null) {
                if (staff.getRecord().getType() > 0) {
                    return Result.error("员工已在职，无法办理入职");
                }
                log.setType(2);
                return updateLog(log);
            }
            return entry(log);
        }
        if (this.staffDao.insert(info) > 0) {
            log.setType(1);
            log.setEntryTime(DateUtils.getCurrentDate());
            log.setSid(info.getId());
            return entry(log);
        }
        return Result.error("员工数据新增失败");
    }

    @Override
    public Result entry(StaffLog log) {
        if (this.staffDao.entry(log) > 0) {
            return Result.success("员工数据新增成功");
        }
        return Result.error("员工数据新增失败");
    }

    /**
     * 通过ID查询单条数据
     * @param data 主键
     * @return 实例对象
     */
    @Override
    public Result queryById(GetData data) {
        return Result.success(this.staffDao.queryById(data.getId()));
    }

    /**
     * 查询多条数据
     * @param page 查询条件
     * @return
     */
    @Override
    public Result queryAllByLimit(PageData page) {
        page.setOffset((page.getPage() -1) * page.getSize());
        List<StaffDataDto> datas = this.staffDao.queryAllByLimit(page);
        if (datas == null) {
            return Result.success(new ResultPage<>(datas, page.getPage(), 0, false));
        }
        return Result.success(new ResultPage<>(datas, page.getPage(), datas.size(), datas.size() == page.getSize()));
    }


    /**
     * 修改数据
     * @param info 实例对象
     * @return 实例对象
     */
    @Override
    public Result update(StaffInfo info) {
        if (this.staffDao.update(info) > 0) {
            return Result.success("员工数据修改成功");
        }
        return Result.error("员工数据修改失败");
    }

    /**
     * 修改员工在/离职数据
     * @param log 实例对象
     * @return
     */
    @Override
    public Result updateLog(StaffLog log) {
        // 更新离职时间
        if (log.getType() == 0) {
            log.setLeaveTime(DateUtils.getCurrentDate());
        }
        // 更新入职时间
        if (log.getType() == 1 || log.getType() == 2) {
            log.setEntryTime(DateUtils.getCurrentDate());
        }
        // 更新停职时间
        if (log.getType() == 3 || log.getType() == 5) {
            log.setSuspendTime(DateUtils.getCurrentDate());
        }
        // 更新复职时间
        if (log.getType() == 4 || log.getType() == 6) {
            log.setRenewTime(DateUtils.getCurrentDate());
        }
        if (this.staffDao.updateLog(log) > 0) {
            return Result.success("员工数据修改成功");
        }
        return Result.error("员工数据修改失败");
    }

    /**
     * 通过主键删除数据
     * @param data 主键
     * @return 是否成功
     */
    @Override
    public Result delById(GetData data) {
        if (this.staffDao.delById(data.getId()) > 0) {
            return Result.success("员工数据删除成功");
        }
        return Result.error("员工数据删除失败");
    }
}
